package Day012_多线程2.demo03_并发包;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @author zhangyan
 * @date 2020/4/30 14:39
 */
/*
   CyclicBarrier的字面意思是可循环使用（Cyclic）的屏障（Barrier）。它要做的事情是，让一组线程到达一个屏障（也可以叫同步点）时被阻塞，
   直到最后一个线程到达屏障时，屏障才会开门，所有被屏障拦截的线程才会继续运行。

    CyclicBarrier构造方法：
                    public CyclicBarrier(int parties, Runnable barrierAction)
                            parties: 代表到达屏障的线程数量
                            barrierAction: 到达屏障后要执行的线程

    CyclicBarrier重要方法：
                    public int await()  每个线程调用await方法告诉CyclicBarrier我已经到达了屏障，然后当前线程被阻塞

    例如：公司召集5名员工开会，等5名员工都到了，会议开始。
 */
public class demo06_CyclicBarrier {
    public static void main(String[] args) {

        //创建CyclicBarrier对象
        CyclicBarrier cb = new CyclicBarrier(5,new Meeting());

        MyRunnable4 mr4 = new MyRunnable4(cb);
        new Thread(mr4,"员工1").start();
        new Thread(mr4,"员工2").start();
        new Thread(mr4,"员工3").start();
        new Thread(mr4,"员工4").start();
        new Thread(mr4,"员工5").start();
    }
}

class MyRunnable4 implements Runnable{
    CyclicBarrier cb;

    public MyRunnable4(CyclicBarrier cb){
        this.cb = cb;
    }
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"员工到会议室了");
        try {
            cb.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (BrokenBarrierException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "离开会议室");
    }
}

class Meeting implements Runnable{
    @Override
    public void run() {
        System.out.println("会议开始...");
    }
}